const jwt = require("jsonwebtoken");
const sha256 = require("crypto-js/sha256");
const moment = require("moment");
const GenId = require("./IdGenerator");
const responseResult = require("./responseResult");
const http = require('http');

// token加密
const getToken = (data, expiresIn) => {
    return jwt.sign(data, process.env.JWT_SECRET || '', {
        expiresIn
    });
}


// token验证
const verifyToken = (token, cb) => {
    return jwt.verify(token, process.env.JWT_SECRET || '', (err, data) => {
        let result = {
            isFlag: true,
            // 解析后的数据
            data
        };
        if (err) {
            result = {
                isFlag: false,

                // 解析后的数据
                data: null
            };
        }
        cb(result)
    });
}

/**
 * 验证参数是否全部存在
 * @param params[] 参数的key 可为url的参数或请求体的参数
 * @data  data Object 响应体或者请求query
 * @return  true代表通过，false代表未通过 Boolean
 */
const checkParam = (params, data) => {
    return params.every(v => data[v] || data[v] === parseInt(0));
}

// 时间获取,毫秒w
const getTime = () => moment().format("x");

// 去除为对象，属性值为null或者undefined的属性值
const resetEmptyValue = (v) => {
    let newObj = {};
    for (let key in v) {
        if (v[key] || v[key] === "" || parseInt(v[key]) === 0) {
            newObj[key] = v[key];
        }
    }
    return newObj;
}

/**
 * 使用哈希的sha256进行密码加密
 * @param v String 密码明文
 * @return String 加密结果
 */
const getPsdSha256 = (v) => {
    return sha256(v).toString();
}

/**
 * 校验密码正确性
 * @param v1 String 数据库的密码
 * @param v2 String 响应体的明文密码
 * @return Boolean 校验结果
 */
const checkPsd = (v1, v2) => {
    v2 = getPsdSha256(v2);
    return v1 === v2;
}

// 获取请求头中的token
const getHeaderToken = (req) => {
    let token = req.header('Authorization');
    if (token) {
        if (token.indexOf('Bearer ') >= 0) {
            return token.slice(7);
        } else {
            return token;
        }
    }
    return ''
}

/**
 * 服务端发起请求（自处理)
 * @param option Object 需要method、header,path
 * @param cb Function 回调方法 参数data，当前响应体
 * @param body Object 请求体
 */
const request = (option, cb, body) => {
    const options = {
        ...option,
        hostname: process.env.HOST,
        port: process.env.PORT,
        method: option.method.toLocaleUpperCase(),
        path:`/api${option.path}`,
        headers: {
            ...option.headers,
            'Content-Type': 'application/json',
        },
    }
    const req = http.request(options, res => {
        let resData = "";
        // 接受到数据
        res.on('data', chunk => {
            resData += chunk;
        });
        // 响应结束
        res.on("end", () => {
            try {
                resData = JSON.parse(resData);
                cb(resData);
            } catch (err) {
                resData = err;
                cb(resData);
            }
        })
    });
    if (options.method === 'POST') {
        req.write(body);
    }
    req.end();
}


// 获取雪花id
const getNextId = () => new GenId({WorkerId: process.env.WORKID}).NextId();
module.exports = {
    getToken,
    verifyToken,
    checkParam,
    resetEmptyValue,
    getPsdSha256,
    checkPsd,
    getTime,
    getNextId,
    getHeaderToken,
    request
}
